// backend/middleware/userAuth.js
const jwt = require('jsonwebtoken');
const UserModel = require('../models/userModel');

const userAuth = async (req, res, next) => {
    try {
        console.log('=== User Auth Middleware 开始 ===');

        // 1. 从请求头获取 token
        const authHeader = req.header('Authorization');
        console.log('Authorization header:', authHeader);

        if (!authHeader || !authHeader.startsWith('Bearer ')) {
            console.log('未提供有效的Authorization头');
            return res.status(401).json({ message: '未提供访问令牌' });
        }

        const token = authHeader.replace('Bearer ', '');
        console.log('提取的token:', token.substring(0, 20) + '...');

        // 2. 验证 token
        const decoded = jwt.verify(token, process.env.JWT_SECRET);
        console.log('解码的token数据:', decoded);

        // 3. 从数据库获取用户信息
        const user = await UserModel.findById(decoded.id);
        console.log('数据库查询结果:', user);

        if (!user) {
            console.log('用户不存在，ID:', decoded.id);
            return res.status(401).json({ message: '用户不存在' });
        }

        // 4. 将用户信息添加到请求对象
        req.user = {
            id: user.id,
            phone: user.phone,
            nickname: user.nickname,
            avatar: user.avatar,
            created_at: user.created_at,  // 添加注册时间字段
            latitude: decoded.latitude,
            longitude: decoded.longitude,
            city: decoded.city
        };

        console.log('=== User Auth Middleware 成功 ===');
        console.log('设置req.user:', req.user);

        next();
    } catch (error) {
        console.error('=== User Auth Middleware 错误 ===');
        console.error('错误详情:', error.message);

        if (error.name === 'JsonWebTokenError') {
            return res.status(401).json({ message: '令牌无效' });
        }
        if (error.name === 'TokenExpiredError') {
            return res.status(401).json({ message: '令牌已过期' });
        }

        res.status(401).json({ message: '认证失败', error: error.message });
    }
};

module.exports = { userAuth };